/**
 * Generali Solutions d'assurances - Tous droits réservés &copy; 2007 - 2010
 */
package fr.generali.accueilclient.client.assembler.input;

import java.util.GregorianCalendar;

import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;

import org.apache.commons.lang.StringUtils;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;

import fr.generali.accueilclient.client.om.IClientProfessionnel;
import fr.generali.accueilclient.client.om.IPersonne;
import fr.generali.accueilclient.client.om.IPersonneMorale;
import fr.generali.accueilclient.client.om.IPersonnePhysique;
import fr.generali.accueilclient.client.om.NaturePersonne;
import fr.generali.refservcommuns.rce.chgmtnature.client.ChangementNatureClient;
import fr.generali.refservcommuns.rce.chgmtnature.dossier.dtochangementnature.DtoChangementNature;
import fr.generali.refservcommuns.rce.chgmtnature.dossier.dtochangementnature.DtoInformationPersonneMorale;
import fr.generali.refservcommuns.rce.chgmtnature.dossier.dtochangementnature.DtoInformationPersonnePhysique;

/**
 * @author selrhazala
 */
@Component("personneToChangementNatureClientConverter")
public class PersonneToChangementNatureClientConverter implements Converter<IPersonne, ChangementNatureClient> {

    /**
     * Code user
     */
    private static final String CODE_USER = "BC";

    /**
     * {@inheritDoc}
     */
    public ChangementNatureClient convert(IPersonne input) {
        ChangementNatureClient changementNatureClient = null;

        if (input != null && StringUtils.isNotEmpty(input.getNumeroClient())) {
            changementNatureClient = new ChangementNatureClient();

            DtoChangementNature dtoChangementNature = new DtoChangementNature();
            dtoChangementNature.setCodeUser(CODE_USER);
            dtoChangementNature.setIdentifiantPersonne(input.getNumeroClient());
            dtoChangementNature.setNouvelleNature(input.getNaturePersonne().getValue());

            if (input.isPersonnePhysique()) {
                IPersonnePhysique personnePhysique = IPersonnePhysique.class.cast(input);
                DtoInformationPersonnePhysique infoPP = new DtoInformationPersonnePhysique();
                infoPP.setCivilite(personnePhysique.getCivilite());
                infoPP.setNom(personnePhysique.getNom());
                infoPP.setPrenom(personnePhysique.getPrenom());

                if (personnePhysique.getDateNaissance() != null) {
                    try {
                        GregorianCalendar gCalendar = new GregorianCalendar();
                        gCalendar.setTime(personnePhysique.getDateNaissance());
                        XMLGregorianCalendar xmlCalendar =
                                        DatatypeFactory.newInstance().newXMLGregorianCalendar(gCalendar);
                        infoPP.setDateNaissance(xmlCalendar);
                    } catch (DatatypeConfigurationException e) {
                        // TODO Auto-generated catch block
                        e.getMessage();
                    }
                }

                dtoChangementNature.setPersonnePhysique(infoPP);

                if (NaturePersonne.PROFESSIONNEL.equals(input.getNaturePersonne())) {
                    IClientProfessionnel clientProfessionnel = IClientProfessionnel.class.cast(personnePhysique);
                    DtoInformationPersonneMorale infoPM = new DtoInformationPersonneMorale();
                    infoPM.setRaisonSociale(clientProfessionnel.getSphereProfessionnelle().getRaisonSociale());
                    dtoChangementNature.setPersonneMorale(infoPM);
                }
            } else {
                IPersonneMorale personneMorale = IPersonneMorale.class.cast(input);
                DtoInformationPersonneMorale infoPM = new DtoInformationPersonneMorale();
                infoPM.setRaisonSociale(personneMorale.getRaisonSociale());
                dtoChangementNature.setPersonneMorale(infoPM);
            }

            changementNatureClient.setDtoChangementNature(dtoChangementNature);
        }

        return changementNatureClient;
    }

}
